nanopyx.core.transform.image_shift_rotate
Combination of functions for rotating an image over an arbitrary center, using several interpolation methods.
1""" 2Combination of functions for rotating an image over an arbitrary center, using several interpolation methods. 3""" 4 5from scipy.ndimage import rotate 6import numpy as np 7 8from ..utils.timeit import timeit2 9from . import interpolation_bicubic 10from . import interpolation_bilinear 11from . import interpolation_nearest_neighbor 12from . import interpolation_catmull_rom 13from . import interpolation_lanczos 14 15from skimage.transform import AffineTransform, warp 16import cv2 17 18@timeit2 19def catmull_rom_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float): 20 interpolator = interpolation_catmull_rom.Interpolator(image) 21 return interpolator.rotate(angle, cx, cy) 22 23 24@timeit2 25def lanczos_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float): 26 interpolator = interpolation_lanczos.Interpolator(image) 27 return interpolator.rotate(angle, cx, cy) 28 29 30@timeit2 31def bicubic_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float): 32 interpolator = interpolation_bicubic.Interpolator(image) 33 return interpolator.rotate(angle, cx, cy) 34 35 36@timeit2 37def bilinear_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float): 38 interpolator = interpolation_bilinear.Interpolator(image) 39 return interpolator.rotate(angle, cx, cy) 40 41 42@timeit2 43def nearest_neighbor_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float): 44 interpolator = interpolation_nearest_neighbor.Interpolator(image) 45 return interpolator.rotate(angle, cx, cy) 46 47 48#def scipy_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float): 49#scipy does not have a simple rotation around an arbitrary point which preserves image size 50#shift + rotation + shift would work but we lose information 51 52@timeit2 53def skimage_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float): 54 rotation = AffineTransform(rotation=angle) 55 shift2center = AffineTransform(translation=-np.array([cx, cy])) 56 shift2og = AffineTransform(translation=np.array([cx, cy])) 57 return warp(image, shift2center + rotation + shift2og) 58 59 60@timeit2 61def cv2_rotate_shift(image: np.ndarray, angle:float, cx:float, cy:float): 62 rotmat = cv2.getRotationMatrix2D(np.array([cx,cy]), np.rad2deg(angle), 1) 63 return cv2.warpAffine(image, rotmat, image.shape[:2][::-1])